//这个是shopCart 模块的vuex模块

//vuex当中的4个核心概念  
// import { from } from "core-js/fn/array"
import {reqAddOrUpdateShopCart,reqshopCarInfo, reqUpdateCartIscheck,reqDeleteShopCart} from '@/api'
const state = {
  shopCarInfo:[]
    //存数据
  } 
  const mutations = {
    //直接修改数据
    RECEIVE_SHOPCATINFO(state,shopCarInfo){
      state.shopCarInfo=shopCarInfo
    }

  }
  const actions = {
    //与组件当中用户对接_
    //一般是异步发请求
    //提交mutations


      //与组件当中用户对接
  //一般是异步发请求
  //提交mutations

  // async 函数称作异步函数，一般内部都是有异步操作的
  // async 函数返回值，一定是promise对象，不看return 
  // 返回的promise对象的成功和失败及结果，要看return
  // return的结果如果是非promise对象 那么promise一定是成功的，成功的结果就是return的结果
  // return的结果如果是promise对象，那么要看这个return后面的promise对象是成功的还是失败的
          //如果return的promise对象是成功的，那么promise对象就是成功的，成功的结果就是return的promise的成功结果
          //如果return的promise对象是失败的，那么promise对象就是失败的，失败的原因就是return的promise的失败原因

  // 如果没有return结果而是抛出错误，promise也是失败的，原因就是抛出的错误原因
  async addOrUpdateShopCart({commit},{skuId,skuNum}){
    const result = await reqAddOrUpdateShopCart(skuId,skuNum)
    // 这个写法，async函数返回的promise将永远成功，不合常理
    // 但是对于我们写代码可行
    // if(result.code === 200){
    //   return 'ok'
    // }else{
    //   return 'failed'
    // }
    if(result.code === 200){
      return 'ok'
    }else{
      return Promise.reject(new Error('failed'))
    }
  },
  async getshopCarInfo({commit}){
    const result=await reqshopCarInfo()
    if(result.code===200){
      commit('RECEIVE_SHOPCATINFO',result.data)
    }
    
  },
  async updateCartIscheck({commit},{skuId,isChecked}){
    const result = await reqUpdateCartIscheck(skuId,isChecked)
    if(result.code === 200){
      return 'ok'
    }else{
      return Promise.reject(new Error('failed'))
    }
  },
  async updateCartIscheckAll({commit,getters,dispatch},isChecked){
    let promises = []
    // getters.cartInfo.cartInfoList  获取到的就是我们的购物车列表数据
    getters.cartInfo.cartInfoList.forEach(item => {
      if(item.isChecked === isChecked) return   //如果发现其中的每个购物车数据已经和要改变的状态一样，那就不用请求改变了
      //拿一个数据提交给上面修改单个的接口去处理
      //也就是说本质还是通过修改单个的去修改多个的，只是采用了Promise.all一次处理
      let promise = dispatch('updateCartIscheck',{skuId:item.skuId,isChecked})
      promises.push(promise)
    })
    return Promise.all(promises)
  },
    //删除单个
    async deleteShopCart({commit},skuId){
      const result = await reqDeleteShopCart(skuId)
      if(result.code === 200){
        return 'ok'
      }else{
        return Promise.reject(new Error('failed'))
      }
    },
  
    //删除多个
    deleteShopCartAll({commit,getters,dispatch}){
      let promises = []
      getters.cartInfo.cartInfoList.forEach(item => {
        if(!item.isChecked) return 
        let promise = dispatch('deleteShopCart',item.skuId)
        promises.push(promise)
      })
      return Promise.all(promises)
    }


  }
  
  const getters = {
    //后面用来简化数据的操作
    cartInfo(state){
    return state.shopCarInfo[0] || {}

    }
  
  }
  export default {
    state,
    mutations,
    actions,
    getters
  }
  